package com.wn.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wn.bean.*;
import com.wn.service.IHouseService;
import com.wn.service.IPropertyInfoService;
import com.wn.service.IPropertyTypeService;
import com.wn.service.IRecordsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author yellow Docter
 * @since 2022-05-24
 */
@RestController
@RequestMapping("/records")
public class RecordsController {

    @Autowired
    private IRecordsService recordsService;

    // 费用 查询
    @Autowired
    private IPropertyTypeService propertyTypeService;


    @Autowired
    private IHouseService houseService;


    @Autowired
    private IPropertyInfoService iPropertyInfoService;

    @GetMapping
    public R queryHouse(Integer currentPage,Integer pageSize){

        IPage<Records> page = new Page<>(currentPage,pageSize);

        //条件查询
        QueryWrapper<Records> qr = new QueryWrapper<>();

        IPage<Records> recordsIPage = recordsService.page(page);

        Long total = recordsIPage.getTotal();
        List<Records> records = recordsIPage.getRecords();


        // forEach( 消费性接口  Consumer)
        // 内部类的写法
//        records.forEach(
//                new Consumer<Records>() {
//                    @Override
//                    public void accept(Records records) {
//                        System.out.println(records);
//                    }
//                }
//        );

        // 内部类的写法  lambda 表达式的写法
        records.forEach(
              e->{
                  //查询费用的类型
                  PropertyType properType = propertyTypeService.getById(e.getTypeId());
                  e.setPropertyType(properType);

                  //查询门牌号
//                  House house = houseService.getById(e.getHouseId());
                  House house = houseService.findHouseById(e.getHouseId());
                  e.setHouse(house);
              }
        );

        // for循环写
//        for (Records record : records) {
//
//        }

        // 组装数据返回结果
        R r = new R();

        if (!CollectionUtils.isEmpty(records)){
            PageBean<Records> pageBean = new PageBean<>();
            pageBean.setData(records);
            pageBean.setTotal(total.intValue());

            r.setData(pageBean);
            r.setMsg("查询成功");
            r.setCode(Constants.SUCCESS_CODE);

            return r;
        }
        return R.ERROR("查询失败");
    }

    /**
     *  抄表的添加工作
     */
    @PostMapping
    public R add(@RequestBody Records records){

        /*
           步骤：
             1、添加抄表记录信息
                 1.1 根据记录中的房子和类型查询上次抄表的度数以及相关时间信息
                               houseId,typeId 查询  上次抄表信息
                     如果存在，需要获取上次的度数，上次时间
                               num2 .  ondatetime  本次的 uptime 是上次的ontime
                     如果不存在 上次度数设置为0  上次时间使用本次时间
                               num = 0  (上次的设置 0 )  上次时间和本次时间一样

                 1.2 添加记录信息
                             addRecord()

             2、添加物业收费信息
                2.1  获取 上次到这次之间的度数信息
                2.2  根据收费类型查询收费标准
                2.3  用1的度数×2的的收费标准 获取相关费用
                2.4  并设定为未缴费状态
                2.5  添加业收费信息
         */

        //根据参数房子id和类型id 获取最后一次登记信息
        // 拿到房子的id
        Integer houId=records.getHouseId();
        // 拿到 费用类型的id
        Integer typeId=records.getTypeId();
        //获取最后一次记录信息
        Records rec=recordsService.queryByHouIdAndTypeId(houId,typeId);

        if(rec!=null){
            //获取上次表的度数  上次抄表时间
            //  当前的记录的这次时间是 是上次的登记时间  getOnTime
            records.setUpTime(rec.getOnTime());
            //  当前的记录的上次   读书  是上次的 记录的 getNum2()
            records.setNum(rec.getNum2());
        }else{
            // 上次登记时间 和 添加时间一样
            records.setUpTime(records.getOnTime());
            records.setNum(0.0);
        }

        //添加记录信息到数据库
        //使用当前时间
        records.setCheckTime(new Date());

        //保存 记录信息
        recordsService.save(records);

        //2 添加费用信息
        PropertyInfo info=new PropertyInfo();

        // 设置 house的Id
        info.setHouseId(houId);
        // 设置 费用类的id
        info.setTypeId(typeId);

        info.setStatus(0);//未缴费

        if(rec!=null){
            // 上次一次 登记记录的时间
            info.setStartDate(rec.getUpTime());
        }else {
            // 没有记录开始和登记时间 一样
            info.setStartDate(records.getOnTime());
        }
        // 登记时间
        info.setEndDate(records.getOnTime());

        //根据类型的id查询类型的费用标准
        PropertyType type=propertyTypeService.getById(typeId);

        double  price=type.getPrice();//获取收费标准
        //获取度数
        // 本次的读书 - 上次的读书 * 2 = 得到money
        double money=(records.getNum2()-records.getNum())*price;

        //添加费用
        info.setMoney(money);
        info.setRemarks(records.getRemarks());

        //添加记录信息
        boolean num= iPropertyInfoService.save(info);

        if(num){
            return R.OK();
        }else{
            return R.ERROR("异常");
        }
    }

}
